`
https://leetcode.cn/problems/lru-cache/
`

// 由于在 V8 引擎中，Map 本身就是哈希表 + 链表混合结构，所以可以直接使用 Map 来实现 LRU 缓存
// 通过 Map 的有序性，可以保证最近访问的元素在 Map 的末尾

class LRUCache {
  constructor(capacity) {
    // 缓存容量
    this.capacity = capacity;
    // 使用 Map 存储键值对（保留插入顺序）
    this.cache = new Map();
  }

  get(key) {
    if (!this.cache.has(key)) return -1

    // 拿到键对应的值
    const val = this.cache.get(key)
    // 先删掉再放回，刷新位置
    this.cache.delete(key)
    this.cache.set(key, val)
    // 返回拿到的值
    return val
  }

  put(key, val) {
    // 如果已经有对应的键，删掉旧的，更新值即可
    if (this.cache.has(key)) {
      this.cache.delete(key)
    }
    // 如果满了
    else if (this.cache.size >= this.capacity) {
      // 删掉最旧的
      const oldestKey = this.cache.keys().next().value
      this.cache.delete(oldestKey)
    }
    // 最后保证新的会被放进去
    this.cache.set(key, val)
  }
}